/*
 * Postgres 文件使用 getopt(3) 时始终包含此文件。
 * 我们必须处理三种不同的情况：
 * 1. 我们正在使用平台的 getopt()，我们只需导入适当的声明。
 * 2. 平台缺少 getopt()，我们必须声明所有内容。
 * 3. 平台有 getopt()，但我们不使用它，因为我们不喜欢它的行为。
 *    我们在这里所做的声明必须与平台的 getopt() 以及我们的 src/port/getopt.c 兼容。
 *
 * Portions Copyright (c) 1987, 1993, 1994
 * The Regents of the University of California.  All rights reserved.
 *
 * Portions Copyright (c) 2003-2022, PostgreSQL Global Development Group
 *
 * src/include/pg_getopt.h
 */
#ifndef PG_GETOPT_H
#define PG_GETOPT_H

/* POSIX说getopt()由unistd.h提供 */
#include <unistd.h>

/* 如果系统中存在，依赖于系统的getopt.h */
#ifdef HAVE_GETOPT_H
#include <getopt.h>
#endif

/*
 * 如果我们有 <getopt.h>，则假定它声明了这些变量，否则我们自己来做
 * (我们过去只是不加条件地声明它们，但 Cygwin
 * 不喜欢这样。)
 */
#ifndef HAVE_GETOPT_H

extern PGDLLIMPORT char *optarg;
extern PGDLLIMPORT int optind;
extern PGDLLIMPORT int opterr;
extern PGDLLIMPORT int optopt;

#endif							/* HAVE_GETOPT_H */


/*
 * 一些平台有optreset但没有在<getopt.h>中声明，因此进行处理。
 * 然而，Cygwin对此也不喜欢。
 */
#if defined(HAVE_INT_OPTRESET) && !defined(__CYGWIN__)
extern PGDLLIMPORT int optreset;
#endif

/* 如果平台没有getopt()的声明，则提供getopt()声明 */
#ifndef HAVE_GETOPT
extern int	getopt(int nargc, char *const *nargv, const char *ostr);
#endif

#endif							/* PG_GETOPT_H */
